7. 分支语句

7.1. 三大结构

程序设计理论已经证明,程序只要三种结构即可以满足任何需求,这三种结构即:

  • 顺序

  • 分支

  • 循环

这种提法主要为了证明我们不需要goto语句,因为goto语句会带来复杂的软件工程问题,所以 现在程序设计语言一般摒弃了goto预计的使用。

所谓顺序语句即我们程序的正常执行都是一行一行的执行,一般来讲我们认为同一个缩进的一行为一个语句,程序执行完后会依次执行同一个缩进的下一行。

在这里,分支语句和后面介绍的循环语句一般情况下也可以笼统的称为一个语句,不论一个分支语句或循环语句占用多少行。

7.2. 分支语句

分支语句用来描述假设和选择的情况,通常可以理解成我们自然语言中的如果...那么...,否则..., 我们在说话的时候可以没有后面的转这部分,但前面的假设部分一定要齐全,不能直说一个如果...., 在代码中同理,分支语句必须齐全,即至少包含如果那么两个部分。

  • 分支的基本语法

      if 条件表达式:
          语句1
          语句2
          语句3
          ......
    
  • 条件表达式就是计算结果必须为布尔值的表达式

  • 表达式后面的冒号不能少

  • 注意if后面的出现的语句,如果属于if语句块,则必须同一个缩进等级

  • 条件表达式结果为True执行if后面的缩进的语句块

7.2.1. 一个无足轻重的小栗子

在这个案例中,我们判断变量age的值,加入它里面存储的是年龄,如果年龄小于18岁,说明还是个孩子:

    # if语句练习
    # 如果age小于18岁,则打印信息“去叫家长”
    age = 17
    if  age < 18:
        print("去叫家长吧,孩纸")
        print("我们不带你玩")
        print("滚球的")

这个运行的结果是:

去叫家长吧,孩纸
我们不带你玩
滚球的

上面栗子的运行结果如上所示,这里我们想强调的是,if下面同一个缩进的打印语句,都具有同一个前提,即if的条件语句返回True,或者 也可以说他们属于同一个语句块

对语句块的理解需要注意,这里也可以说,他们属于同一个if语句,在计算语句条数的时候,不管if语句后面有多少行,也可以算一条语句代码。

7.2.2. 再举一个栗子

这个案例我想展示的是,如果if语句的条件判断语句返回的是 False,则if下面缩进的所有语句都不执行,直接执行if语句的下一句,注意的是,所谓的下一 条语句,就是跟if关键字具有同一个缩进(对齐)的语句。

    # if语句练习
    # 如果age小于18岁,则打印信息“去叫家长”
    # 需要注意,以下总共三个语句,最后的print总会被执行
    age = 19
    if  age < 18:
        print("去叫家长吧,孩纸")
        print("我们不带你玩")
        print("滚球的")
        
    print("开始上车喽,老司机们")

上面案例执行结果是:

开始上车喽,老司机们

下面的案例有点啰嗦,也放这里吧:

# 又一个练习
print("今天学习if语句")
gender = "男"
if gender == "女":
    print("你好,我叫刘大拿,我单身, :) ")
print("开始讲for循环了")

运行结果是:

今天学习if语句
开始讲for循环了

7.2.3. 最后一个啰嗦的案例

在我们的学习条件语句的时候。需要注意的是条件,具体满足什么条件,或者在什么条件下才真正执行后面的 语句,如果条件逻辑判断错误,覆盖有重叠或者没有把各种情况都考虑到,很可能会造成有的条件满足了你的代码也 没执行的后果,下面的案例很多初学者会漏掉一些判断条件。

    # 案例:
    # 考试成绩判断,考试成绩可以判定学生水平,对应如下
    # 90以上: 输出优秀
    # 80-90:良
    # 70-80:中
    # 60-70:平
    # 60以下: 输出:我没你这撒学僧
    # score  存放学生成绩
    
    # 注意input的返回值类型
    score = input("请输入学生成绩:")
    # 需要把str转换成int
    score = int(score)

    if score>=90:
        print("A")
    if score>= 80  and score<90:
        print("B")
    if score >= 70 and score<80:
        print("C")
    if score >=60 and score<70:
        print("D")
    if score < 60:
        print("起开,我没你这撒学僧")

案例运行结果如下,当我输入学生成绩是48的时候:

    请输入学生成绩:48
    起开,我没你这撒学僧

7.3. if...else... 语句

if语句总给人说话说话一般的感觉,假设我们真的不能说话说半截,还需要带转折,即如果....,那么...., 否则.....模式, 这种我们称之为双向分支,即我们平常的所谓转折语句,我们用else来表示这种情况。

这种转折语句的常见表达形式如下:

    if 条件表达式:
        语句1
        语句2
        ...
    else:
        语句1
        语句2
        .....

我们需要注意的是,双向分支有两个分支,当程序执行到if ... else...语句的时候,一定会执行ifelse中的一个,也仅执行一个。

缩进问题,ifelse需要对齐,他们下面的语句所今后需要对齐

7.3.1. 一个双头栗子

这个案例根据输入的内容进行判断,然后决定打印出啥内容。

    # input的作用是
    # 1. 在屏幕上输出括号内的字符串
    # 2. 接受用户输入的内容并返回到程序
    # 3. input返回的内容一定是字符串类型
    gender = input("请输入性别:")
    print("你输入的性别是:{0}".format(gender))

    if  gender == "nan":
        print("来,我们纪念一下今天吧,代码敲十遍")
    else:
        print("发糖喽发糖喽")
        print("你是女生,特殊照顾喽")
            
    print("开始上课喽")

运行案例,我随便输入一个内容,然后输出的其实是不是nan的那个判断的内容,点解?

        请输入性别:aklalk
        你输入的性别是:aklalk
        发糖喽发糖喽
        你是女生,特殊照顾喽
        开始上课喽

上面案例其实有一个逻辑错误,即如果我输入的不是nan,统统归入女士的条件分支里

7.4. 多路分支

如果出现多种情况进行选择,比如上面的判断学生成绩的案例,我们需要用到多个if...else...进行判断,这样会造成逻辑结构复杂,容易混淆等,为了简化多个 if...else...的使用,我们可以使用多路分支进行代码编写。

很多分支的情况,简称多路分支,关键字elif可以看做是..else...if...的简写,功能完全相同,所以捏,所谓多路分支真的 就是多个if...else if ... else....的缩写,别想太多了。

多路分支的代码结构:

    if  条件表达式:
        语句1
        ....
    elif 条件表达式:
        语句1
        ...
    elif 条件表达式:
        语句1
        ...
        
    .....
    else:
        语句1
        ....

做一个小小的说明:

  1. elif 可以由很多个

  2. else可选,表示最后的一个可能

  3. 多路分支虽然有多个,但最后只会选一个执行

7.4.1. 相对简洁的成绩判断程序

成绩判断代码可以改成多路分支,相对来讲简洁多了,这里需要注意下条件判断,比纯if语句好像少了些判断条件,点解?

# score  存放学生成绩
# 注意input的返回值类型
score = input("请输入学生成绩:")
# 需要把str转换成int
score = int(score)

if score>=90:
    print("A")
elif score>= 80:
    print("B")
elif score >= 70:
    print("C")
elif score >=60 :
    print("D")
else:
    print("起开,我没你这撒学僧")

如果输入45,则得到下面的运行结果:

请输入学生成绩:45
起开,我没你这撒学僧

7.5. if语句其他问题

  • if语句可以嵌套使用,但不推荐

  • python没有switch-case语句

  • 在实际使用当中,个人习惯我倾向于多个if语句代替if...else...语句,觉得比较简洁些,纯属个人蜜汁操作,其实仔细想来也毫无理由。